// 路由中间件函数抽离为controller
const { Article, User } = require('../model')

// 获取文章列表
exports.listArticles = async (req,res, next) => {
    try {
        const {
            limit = 20,
            offset = 0,
            tag,
            author
        } = req.query

        // 根据tag进行筛选
        const filter = {}

        if (tag) {
            filter.tagList = tag
        }

        // 对author进行判断: 需要先导入User进行查询
        if (author) {
            const user = await User.findOne({ username: author})
            filter.author = user ? user._id : null
        }

        const articles = await Article.find(filter)
            .skip(Number.parseInt(offset))  // 跳过多少条（对应Offset)
            .limit(Number.parseInt(limit)) // 取多少条（对应limit)
            .sort({
                // -1: 降序 1: 升序
                createdAt: -1
            }) // 对查询结果进行排序
        // 获取数据总数
        const articlesCount = await Article.countDocuments()
        res.status(200).json({
            articles,
            articlesCount
        })
    } catch (err) {
        next(err)
    }
}

// 推送文章列表（关注人文章）
exports.feedArticles = async (req,res, next) => {
    try {
        // 处理请求
        res.send('GET /api/articles/feed')
    } catch (err) {
        next(err)
    }
}

// 获取文章
exports.getArticle = async (req,res, next) => {
    try {
        // 查询的时候不用添加执行方法
        const article = await Article.findById(req.params.articleId)
            .populate('author')

        if (!article) {
            return res.status(404).end()
        }
        res.status(200).json({
            article
        })
    } catch (err) {
        next(err)
    }
}

// 创建文章
exports.createArticle = async (req,res, next) => {
    try {
        // 从request中拿到数据
        const article = new Article(req.body.article)
        // 从身份认证中间件中拿到用户id
        article.author = req.user._id
        // user内容映射，只是把内容查出来了，数据库里保存的依然是ID
        await article.populate('author').execPopulate()
        // 将数据保存到数据库中
        await article.save()
        // 成功返回
        res.status(200).json({
            article
        })
        // res.send('POST /api/articles')
    } catch (err) {
        next(err)
    }
}

// 更新文章
exports.updateArticle = async (req,res, next) => {
    try {
        const article = req.article
        const bodyArticle = req.body.article
        // 如果没有，就设为原来的
        article.title = bodyArticle.title || article.title
        article.description = bodyArticle.description || article.description
        article.body = bodyArticle.body || article.body
        await article.save()
        res.status(200).json({
            article
        })
    } catch (err) {
        next(err)
    }
}

// 删除文章
exports.deleteArticle = async (req,res, next) => {
    try {
        // req.article是mongoose的model实例，是查出来的
        const article = req.article
        await article.remove()
        res.status(201).end()
    } catch (err) {
        next(err)
    }
}

// 给文章添加评论
exports.addComments = async (req,res, next) => {
    try {
        // 处理请求
        res.send('POST /api/articles/:slug/comments')
    } catch (err) {
        next(err)
    }
}

// 从文章获取评论
exports.getComments = async (req,res, next) => {
    try {
        // 处理请求
        res.send('GET /api/articles/:slug/comments')
    } catch (err) {
        next(err)
    }
}

// 删除评论
exports.deleteComment = async (req,res, next) => {
    try {
        // 处理请求
        res.send('DELETE /api/articles/:slug/comments/:id')
    } catch (err) {
        next(err)
    }
}

// 收藏文章(favorite)
exports.favoriteArticle = async (req,res, next) => {
    try {
        // 处理请求
        res.send('POST /api/articles/:slug/favorite')
    } catch (err) {
        next(err)
    }
}

// 取消文章收藏(unfavorite)
exports.unfavoriteArticle =  async (req,res, next) => {
    try {
        // 处理请求
        res.send('DELETE /api/articles/:slug/favorite')
    } catch (err) {
        next(err)
    }
}



